package controllers;


import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import views.*;
import models.Treino;
import models.Usuario;
import play.data.Form;
import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.Security;
import dao.DAOTreino;
import dao.DAOUsuario;


public class UsuarioControle extends Controller {

	
	private static Form<Usuario> formUsuario = new Form<Usuario>(Usuario.class);
  
	@Security.Authenticated(Seguranca.class)
    public static Result index() {
        return ok(views.html.usuario.index.render());
    }
	
	@Security.Authenticated(Seguranca.class)
	public static Result cadastrarView(){
		return ok(views.html.usuario.cadastrar.render());
	}
	
	@Security.Authenticated(Seguranca.class)
	public static Result editarView(int id){
		DAOUsuario dao = new DAOUsuario();
		try{
			Usuario u = new Usuario();
			u = dao.select(id);
			return ok(views.html.usuario.editar.render(u));
		}catch(Exception e){
			return internalServerError("Erro ao visualizar usuario.");
		}
	}
	
	@Security.Authenticated(Seguranca.class)
	public static Result listarView() {
		DAOUsuario dao = new DAOUsuario();
		try {
			Set<Usuario> usuarios = dao.select();
			return ok(views.html.usuario.listar.render(usuarios));
		} catch (Exception e) {
			return internalServerError("Erro ao visualizar usuarios.");
		}
		
	}
	
	@Security.Authenticated(Seguranca.class)
	public static Result cadastrar(){
		Form<Usuario> novoUsuario = formUsuario.bindFromRequest();
		Usuario usuario = novoUsuario.get();
		//Usuario.inserir(usuario);
		
		System.out.println(usuario.bairro);
		System.out.println(usuario.cidade);
		System.out.println(usuario.cpf);
		System.out.println(usuario.cref);
		System.out.println(usuario.email);
		System.out.println(usuario.endereco);
		System.out.println(usuario.idPerfil);
		System.out.println(usuario.idUsuario);
		System.out.println(usuario.login);
		System.out.println(usuario.nome);
		System.out.println(usuario.numero);
		System.out.println(usuario.senha);
		System.out.println(usuario.telefone);
		System.out.println(usuario.uf);
		
		DAOUsuario dao = new DAOUsuario();
		try{
			dao.insert(usuario);
			return Application.home();
			
		}catch(Exception e){
			return internalServerError("Erro ao cadastrar usuario.");
		}
	}
	
	@Security.Authenticated(Seguranca.class)
	public static Result editar(){
		Form<Usuario> novoUsuario = formUsuario.bindFromRequest();
		Usuario usuario = novoUsuario.get();
		DAOUsuario dao = new DAOUsuario();
		try{
			dao.update(usuario);
			return ok("Usuario atualizado!");
		}catch(Exception e){
			e.printStackTrace();
			return internalServerError("Erro ao editar usuario.");
		}
		
	}
	
	@Security.Authenticated(Seguranca.class)
	public static Result remover(){
		Form<Usuario> novoUsuario = formUsuario.bindFromRequest();
		Usuario usuario = novoUsuario.get();
		DAOUsuario dao = new DAOUsuario();
		try{
			dao.delete(usuario);
			return ok("Usuario removido!");
		}catch(Exception e){
			e.printStackTrace();
			return internalServerError("Erro ao remover usuario.");
		}
	}
	
	public static Result autenticar() {
		
		Form<Usuario> novoUsuario = formUsuario.bindFromRequest();
		Usuario usuario = novoUsuario.get();
		
		DAOUsuario dao = new DAOUsuario();
		try{
			usuario = dao.autenticar(usuario);
			if (usuario.nome != null && !usuario.nome.equals("")) {
				Set<Usuario> usuarios = dao.select();
				
				session("login", usuario.login);
				session("perfil", String.valueOf(usuario.idPerfil));
				session("nome", usuario.nome);
				session("usuario_id", String.valueOf(usuario.idUsuario));
				
				if (usuario.idPerfil == 2){
					DAOTreino daoTreino = new DAOTreino();
					Set<Treino> treinos = new HashSet<Treino>();
					treinos = daoTreino.select();
					
					for (Treino t: treinos){
						Date dataHoje = new Date();
						if(Integer.parseInt(t.dataFinal) - Integer.parseInt(dataHoje.toString()) < 7){
							return Application.home();//ALERTA!!
						}
					} 
				}
				
				return Application.home();
			}
			return internalServerError("Erro autenticacao");
		}catch(Exception e){
			e.printStackTrace();
			return internalServerError("Erro ao remover usuario.");
		}
	}
	
	@Security.Authenticated(Seguranca.class)
	public static Result selecionar(String id) {
		DAOUsuario daoUsuario = new DAOUsuario();
		try {
			Usuario usu = daoUsuario.select(Integer.parseInt(id));
			session("usuario_selecionado_id", id);
			session("usuario_selecionado_nome", usu.nome);
			
			return ok(usu.nome);			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return badRequest("Ocorreu algum problema no banco, o id passado não é válido");
	}
	
	@Security.Authenticated(Seguranca.class)
	public static Result buscarUsuario(String nome) {
		DAOUsuario dao = new DAOUsuario();
		Usuario usuario = new Usuario();
		usuario.nome = nome;
		usuario.idPerfil = Integer.parseInt(session("perfil"));
		try {
			List exercicio = new ArrayList<Usuario>(dao.selectXNomeEPerfil(usuario));
			return ok(views.html.usuario.usuarioJson.render(exercicio));
		} catch (Exception e) {
			return ok("[\"grupoMuscular\":{\"id\":\"-1\"}]");
		}
	}
}
